Solidity 스마트 컨트랙트 기본 정리
1️⃣ Solidity란?
- 이더리움(Ethereum) 기반 스마트 컨트랙트 작성 언어
- 객체지향(OOP) + 계약 중심 언어
- 타입 안정성(Type Safety), 가스(Gas) 모델, 실행 예측 가능성을 제공
- 작성된 코드는 EVM(Ethereum Virtual Machine) 에서 실행
2️⃣ 스마트 컨트랙트 구조
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0; // Solidity 버전 지정
contract MyContract {
uint public myValue; // 상태 변수 (storage에 저장)
// 생성자: 컨트랙트 배포 시 단 1회 실행
constructor() {
myValue = 10;
}
// 값 설정 함수 (트랜잭션 발생)
function setValue(uint _val) public {
myValue = _val;
}
// 값 조회 함수 (view: 읽기 전용, 가스 소모 없음)
function getValue() public view returns (uint) {
return myValue;
}
}
🔹 핵심 구성 요소
| 구성 요소 | 설명 |
|---|
pragma solidity ^0.8.0; | 컴파일러 버전 지정 |
contract | 컨트랙트 정의 블록 |
| 상태 변수(State Variable) | 블록체인에 영구 저장되는 값 |
contractor() | 컨트랙트 배포 시 최초 1회 실행 |
| 함수(Function) | 데이터 조작·조회 로직 |
| 함수 한정자(Modifier) | 함수 접근 제어·로직 재사용을 위한 키워드 (public, view, payable 등) |
3️⃣ 주요 데이터 타입
| 타입 | 설명 |
|---|
uint,int | 부호 없는 정수 / 부호 있는 정수 (기본 256bit, uint8~uint256 지정 가능) |
bool | true/false |
address | 20바이트 지갑·컨트랙트 주소 |
string | 유니코드 문자열 (가변 길이) |
bytes,byte32 | 바이트 배열 (가변/고정 길이) |
| 배열(Array) | 예: uint[] 또는 address[5] |
| 구조체(Struct) | 사용자 정의 데이터 구조 |
| 매핑(Mapping) | Key-Value 형태 저장소(mapping(address => uint) balances; |
4️⃣ 접근 제어(Visibility)
| 키워드 | 설명 |
|---|
public | 내부·외부 모두 접근 가능 (자동 getter 생성) |
private | 정의된 컨트랙트 내부에서만 접근 가능 (상속 불가) |
internal | 같은 컨트랙트 및 상속받은 컨트랙트에서 접근 가능 |
external | 외부에서만 호출 가능 (내부 호출 시 this.functionName() 필요) |
uint private secret;
function reveal() public view returns (uint) {
return secret; // 내부 접근 가능
}
5️⃣ 함수 속성(Function Modifiers)
| 키워드 | 설명 |
|---|
view | 읽기 전용(상태 변경 없음, 가스 소모 없음) |
pure | 상태 변수 접근·변경 없이 연산만 수행 |
payable | ETH 전송을 허용하는 함수 |
override | 상속한 함수 재정의 |
virtual | 상속받은 컨트랙트에서 재정의 가능하게 설정 |
6️⃣ 가스(Gas)와 트랜잭션
- 가스(Gas): EVM에서 연산 수행 비용 단위
- 상태 변경 함수(
setValue) → 가스 비용 발생
- 읽기 전용 함수(
view, pure) → 가스 비용 없음 (로컬 실행)
7️⃣ 예제: 상태 변수, 매핑, 구조체 활용
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract UserStorage {
struct User {
string name;
uint age;
}
mapping(address => User) public users;
function register(string memory _name, uint _age) public {
users[msg.sender] = User(_name, _age);
}
function getUser(address _addr) public view returns (string memory, uint) {
User memory u = users[_addr];
return (u.name, u.age);
}
}